①var是函数作用域。通过 var 关键词声明的变量没有块作用域，在块 {} 内声明的变量可以从块之外进行访问。

{ 
  var x = 10; 
}
// 此处可以使用 x

②使用 var 关键字重新声明变量会带来问题，在块中重新声明变量也将重新声明块外的变量。
var x = 10;
// 此处 x 为 10
{ 
  var x = 6;
  // 此处 x 为 6
}
// 此处 x 为 6

③通过 var 关键词定义的全局变量属于 window 对象。
④在相同的作用域，或在相同的块中，通过 var 重新声明一个 let 变量是不允许的；
⑤通过 var 声明的变量会提升到顶端，所以先使用后声明也行





①let是块作用域。使用 let 关键词声明拥有块作用域的变量，在块 {} 内声明的变量无法从块外访问。
{ 
  let x = 10;
}
// 此处不可以使用 x

②let在块中重新声明变量不会重新声明块外的变量。
var x = 10;
// 此处 x 为 10
{ 
  let x = 6;
  // 此处 x 为 6
}
// 此处 x 为 10

③通过 let 关键词定义的全局变量不属于 window 对象。
④在相同的作用域，或在相同的块中，通过 let 重新声明一个 let 变量是不允许的；在不同的作用域或块中，通过 let 重新声明变量是允许的。
⑤通过 let 定义的变量不会被提升到顶端，变量从块的开头一直处于“暂时死区”，直到声明为止，所以let不能在定义之前访问该变量。




①在块作用域内使用 const 声明的变量与 let 变量相似。
var x = 10;
// 此处，x 为 10
{ 
  const x = 6;
  // 此处，x 为 6
}
// 此处，x 为 10

②const 变量必须在声明时赋值。

③不是真正的常数，它没有定义常量值。它定义了对值的常量引用，因此，我们不能更改常量原始值，但我们可以更改常量对象的属性。

④常量对象可以更改，但是无法重新为常量对象赋值，例如：
// 您可以创建 const 对象：
const car = {type:"porsche", model:"911", color:"Black"};

// 您可以更改属性：
car.color = "White";

// 您可以添加属性：
car.owner = "Bill";

//无法重新为常量对象赋值
const car = {type:"porsche", model:"911", color:"Black"};
car = {type:"Volvo", model:"XC60", color:"White"};    // ERROR

⑤在同一作用域或块中，不允许将已有的 var 或 let 变量重新声明或重新赋值给 const
var x = 2;         // 允许
const x = 2;       // 不允许
{
  let x = 2;     // 允许
  const x = 2;   // 不允许
}

⑥在同一作用域或块中，为已有的 const 变量重新声明声明或赋值是不允许的。
⑦通过 const 定义的变量不会被提升到顶端，const 变量不能在声明之前使用